package com.cskaoyan.javase.array._1basic._1initialization;

/**
 * 数组的初始化,类比于变量的初始化
 * 变量的初始化: 就是开辟内存空间然后赋值
 * 数组的初始化: 也是一样的,也需要开辟内存空间,然后存储元素,这里要求两点:
 *      1.要想开辟空间,首先需要知道数组的长度
 *      2.数组中的所有元素,都要有一个明确的值
 * 满足以上两点,才叫数组的初始化
 *
 * 数组初始化的两种方式:
 *      格式1,静态初始化,指的是程序员直接明确数组中每一个元素的取值,长度也是程序员间接指定的
 *      语法: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3..};
 *      静态初始化有简写的形式:
 *          数据类型[] 数组名 = {元素1,元素2,元素3..};
 *          但是需要注意,数组静态初始化的简写形式,必须和声明写在一起,不允许直接用简写的形式给数组变量赋值
 *
 *      格式2,动态初始化,指的是由程序员明确给出数组的长度,但是数组元素的取值由系统默认指定一个默认值
 *      语法: 数据类型[] 数组名 = new 数据类型[长度];
 *
 *  思考:
 *      数组除了这两种初始化方式,还有没有第三种?
 *      "动静结合"是典型的错误,(一维)数组没有第三种初始化方式
 *
 * 静态初始化创建的数组格式会比较固定,动态初始化的方式会更加灵活.
 *
 * 数组的缺点: 一个数组一旦经常初始化,那么它的长度就是固定的,不能缩短也不能变长.这是数组非常大的一个缺点,所以我们在使用数组时,要认真考虑数组的长度.
 *      在实际开发中,直接使用数组的场景是非常少见的,而是使用集合中ArrayList去替代数组使用.(ArrayList的底层实现仍然是一个数组,它继承了数组随机访问,有下标,能够存放元素,但是它不受数组长度的限制,它是通过拷贝元素到一个新数组来实现扩容的)
 *
 *
 *  在上述数组的静态,动态初始化中,需要开辟内存空间,存放数组元素,开辟的实际上是JVM的内存空间
 *
 *
 * @since 16:25
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 1.静态初始化一个int数组
        // 没有给出任何元素,是一个长度为0的数组
        int[] arr = new int[]{};
        int[] arr2 = new int[]{1, 2, 3};
        // 静态初始化的简写形式
        String[] arr3 = {"a", "b", "c"};
        // arr3 = {"a","1","3"};


        // 2.动态初始化一个double数组
        double[] arr4 = new double[3];

        // 3.尝试"动静结合"初始化数组,这种方式是不行的
        // byte[] arr5 = new byte[3]{1,2,3};
    }
}
